home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Euroscene 1
/
Euroscene 1.iso
/
resource
/
pchglib_11.lha
/
SHAM2PCHG.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-01-22
|
4KB
|
119 lines
#include <proto/exec.h>
#include <proto/graphics.h>
#include <exec/types.h>
#include <exec/memory.h>
#include <hardware/custom.h>
#include <graphics/gfxmacros.h>
#include <graphics/copper.h>
#include <intuition/screens.h>
#include <iff/pchg.h>
#include <clib/pchglib_protos.h>
#if INCLUDE_VERSION<36
FAILURE!! Amiga includes version<36
#endif
/****** pchg.lib/PCHG_SHAM2PCHG ****************************************
NAME
PCHG_SHAM2PCHG -- Fakes a PCHG chunk from a SHAM chunk
SYNOPSIS
PCHGHeader = PCHG_SHAM2PCHG(SHAMChunk, SHAMSize, Increment);
struct PCHGHeader *PCHG_SHAM2PCHG(UWORD *, ULONG, WORD);
FUNCTION
Creates a PCHGHeader and a LINEMASK (see the PCHG specs) by parsing a
SHAM chunk. The memory block containing the SHAM is overwritten by an
array of SmallPaletteChanges (this array is always shorter than the
original SHAM chunk). A memory block is allocated for the PCHGHeader
and for the LINEMASK (which is of course placed just after the
PCHGHeader), and is returned by the function. You can then free it
using as dimension the size of a PCHGHeader plus the number of bytes
required by the longword mask, i.e.,
sizeof(struct PCHGHeader)+((PCHGHeader->LineCount+31)/32)*4
You can parse this chunk as any PCHG chunk, but the changes per line
could be more than seven (up to fifteen). This function, however, is
intelligent, and doesn't generate useless color changes (i.e., it
never pokes again the same value two times). You will usually call
PCHG_SetUserCopList(0, 0, Screen, PCHGHeader, &PCHGHeader[1], SHAMChunk);
after using PCHG_SHAM2PCHG().
INPUTS
SHAMChunk - The address of the SHAM chunk.
SHAMSize - The size of the SHAM chunk (we handle >200
lines chunks).
Increment - The increment to add to the line number while parsing
the SHAM chunk. It has to be 1 for non-laced pictures,
2 for laced pictures.
RESULT
PCHGHeader - A pointer to a memory block contaning a PCHGHeader
followed by a LINEMASK, or NULL if the memory
allocation failed. You have to free this memory after
you used it.
EXAMPLE
NOTES
This function will not generate any change on line 0, because the
line 0 colors should be the same of the CMAP. If you get any problem,
you can feed the first line of the SHAM chunk as a color table to the
screen before calling this function.
Since this function writes in the fake PCHG chunk only the real
changes, you will generally get a better display using this function
and PCHG_SetUserCopList() than with SHAMVIEW, for instance.
BUGS
SEE ALSO
*****************************************************************************/
struct PCHGHeader *PCHG_SHAM2PCHG(UWORD *SHAMChunk, ULONG SHAMSize, WORD Increment) {
int i,j,k;
UWORD Pal[16], *p;
struct PCHGHeader *pch;
ULONG *LineMask, LineCount;
LineCount = (SHAMSize-2)/32;
if (!(pch = AllocMem(sizeof(struct PCHGHeader)+((LineCount*Increment+31)/32)*4, MEMF_PUBLIC | MEMF_CLEAR))) return(NULL);
LineMask = (void *)&pch[1];
for(i=1; i<16; i++) Pal[i] = SHAMChunk[i+1] & 0xFFF;
p = SHAMChunk++;
pch->MinReg = 15;
for(i=1; i<LineCount; i++) {
for(j=1, k=0; j<16; j++)
if (Pal[j] != SHAMChunk[i*16+j] & 0xFFF) {
p[++k] = (Pal[j] = SHAMChunk[i*16+j] & 0xFFF) | j<<12;
if (pch->MinReg>j) pch->MinReg = j;
if (pch->MaxReg<j) pch->MaxReg = j;
}
if (k) {
*p = k<<8;
p+=(k+1);
LineMask[(i*Increment)/32] |= 1<<(31-(i*Increment)%32);
pch->ChangedLines++;
pch->TotalChanges += k;
if (k>pch->MaxChanges) pch->MaxChanges = k;
}
}
pch->Compression = PCHG_COMP_NONE;
pch->Flags = PCHGF_12BIT;
pch->StartLine = 0;
pch->LineCount = LineCount*Increment;
return(pch);
}